package com.fdb.efp.nls.service.impl.psd;

import com.alibaba.fastjson.JSONObject;
import com.fdb.basic.framework.core.constant.BaseConstant;
import com.fdb.basic.framework.core.exception.ESBException;
import com.fdb.basic.framework.core.util.DateTool;
import com.fdb.basic.framework.core.util.StringUtil;
import com.fdb.efp.nls.service.facade.psd.PsdRiskWarningSendMsgService;
import com.fdb.efp.console.common.psd.PsdEnumSet;
import com.fdb.efp.nls.service.facade.PtProductUserService;
import com.fdb.efp.nls.service.vo.PtProductUserVO;
import com.fdb.efp.esb.service.bo.req.sed.letter.ReqSedLetterBean;
import com.fdb.efp.esb.service.facade.EsbInvokeWrapper;
import com.fdb.efp.esb.service.facade.sed.letter.SedLetterInformService;
import com.fdb.efp.nls.common.constant.sed.SedNlsEnum;
import com.fdb.efp.nls.common.util.letter.MessageFactory;
import com.fdb.efp.nls.common.util.letter.message.PsdRiskWarningMessage;
import com.fdb.efp.nls.service.facade.NlsQueueSoltComnService;
import com.fdb.efp.nls.service.facade.RscWarnLoanService;
import com.fdb.efp.nls.service.vo.RscWarnLoanVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

/**
* 普税贷产品对税e贷产品的此部分代码做了复用
* 说明：为了保证功能的复用性、提升开发的工作效率，对该代码进行了复用
* 评估是否会影响线上功能：否
* 评估时间：2020/5/25
* 处理方案：保留复用
*/

/**
 * 需求编号：【2019D1218】（普税贷需求）
 * 问题编号：【2019D1218】（普税贷风险预警发送短信信息）
 * 开发人员：【ludayong】
 * 创建日期：【2020/4/23 12:32】
 * 功能描述：
 * 修改日期：【2020/4/23 12:32】
 * 修改描述：
 */
@Service("psdRiskWarningSendMsgService")
public class PsdRiskWarningSendMsgServiceImpl implements PsdRiskWarningSendMsgService {

    private static Logger logger = LoggerFactory.getLogger(PsdRiskWarningSendMsgServiceImpl.class);

    /**
     * 需求编号：【2019D1218】（普税贷需求）
     * 问题编号：【2019D1218】（普税贷风险预警发送短信信息）
     * 开发人员：【ludayong】
     * 创建日期：【2020/4/23 14:39】
     * 功能描述：
     * 修改日期：【2020/4/23 14:39】
     * 修改描述：
     */
    @Override
    public Boolean sendPsdRiskWarningMsg() throws Exception {
        logger.info("普税贷风险预警发送短信信息任务处理开始...");
        // 分页大小
        Integer pageSize = 1000;
        // 分页信息
        RscWarnLoanVO pageInfo = new RscWarnLoanVO();
        // 页数
        int page = 1;
        // pageSize初始化
        pageInfo.setSize(pageSize);
        // 判断循环次数
        int size = rscWarnLoanService.queryBySendFlagCount();
        String size_msg = "【查询普税贷风险预警信息数据量】：" + size;
        logger.info(size_msg, "message{}");
        int loopCount = (size / pageInfo.getSize()) + (size % pageInfo.getSize() == 0 ? 0 : 1);
        for (int i = 0; i < loopCount; i++) {
            String page_msg = "【普税贷风险预警信息查询】当前页数：" + pageInfo.getPage() + "，分页大小：" + pageInfo.getSize();
            logger.info(page_msg, "message{}");
            // 分页查询普税贷风险预警信息，发送预警信息
            processSendRiskWarningMsg(Optional.ofNullable(rscWarnLoanService.queryBySendFlagByPage(pageInfo)).orElseGet(ArrayList::new));
            // 下一页
            pageInfo.setPage(++page);
        }
        logger.info("普税贷风险预警发送短信信息处理结束...");
        return true;
    }

    /**
     * 需求编号：【2019D1218】（普税贷需求）
     * 问题编号：【2019D1218】（普税贷风险预警发送短信信息）
     * 开发人员：【ludayong】
     * 创建日期：【2020/4/23 14:39】
     * 功能描述：
     * 修改日期：【2020/4/23 14:39】
     * 修改描述：
     */
    private void processSendRiskWarningMsg(List<RscWarnLoanVO> warnList)  {
        if (Objects.isNull(warnList) || warnList.isEmpty()) {
            logger.info("普税贷风险预警信息查询为空！");
            return;
        }
        for (RscWarnLoanVO r : warnList) {
            if (StringUtil.isNullorBank(r.getCusManager())) {
                continue;
            }
            // 查询客户经理信息
            PtProductUserVO queryPtProductUserVO = Optional.ofNullable(ptProductUserService.getPtProduceByLoginName(r.getCusManager())).orElseGet(PtProductUserVO::new);
            // 客户经理信息联系方式不为空
            if (!StringUtil.isNullorBank(queryPtProductUserVO.getPhone()) && SedNlsEnum.YesOrNo.NO.getValue().equals(r.getSendFlag()) && !StringUtil.isNullorBank(r.getCusName()) && !StringUtil.isNullorBank(r.getRiskLevel())) {
                // 调用短信接口发送短信
                Boolean sendFlag = invokeRiskWarningMsg(queryPtProductUserVO.getPhone(), r.getCusName(), getRiskLevelCn(r.getRiskLevel()));
                if (sendFlag) {
                    // 风险预警台账信息
                    RscWarnLoanVO inRscWarnLoanVo = new RscWarnLoanVO();
                    // 借据号
                    inRscWarnLoanVo.setCertCode(r.getCertCode());
                    // 风险处理标识
                    inRscWarnLoanVo.setSendFlag(SedNlsEnum.YesOrNo.YES.getValue());
                    // 最后更新人
                    inRscWarnLoanVo.setLastUpdateUser(BaseConstant.ADMIN);
                    // 最后更新时间
                    inRscWarnLoanVo.setLastUpdateTime(DateTool.getCurrentDateTime());
                    int num = rscWarnLoanService.updateSendFlagByBillNo(inRscWarnLoanVo);
                    if (num == -1) {
                        logger.error("普税贷风险预警发送短信信息，更新风险预警信息失败！,数据为{}", JSONObject.toJSONString(inRscWarnLoanVo));
                        //throw new RuntimeException("普税贷风险预警发送短信信息，更新风险预警信息失败！");
                    }
                }
            }
        }
    }

    /**
     * 需求编号：【2019D1218】（普税贷需求）
     * 问题编号：【2019D1218】（调用短信接口发送短信）
     * 开发人员：【ludayong】
     * 创建日期：【2020/4/23 14:39】
     * 功能描述：
     * 修改日期：【2020/4/23 14:39】
     * 修改描述：
     */
    public Boolean invokeRiskWarningMsg(String phone, String cusName, String level) {
        Boolean sendFlag = false;
        try {
            ReqSedLetterBean letter = new ReqSedLetterBean();
            letter.setMblNo(phone);
            letter.setCntntInf(new MessageFactory(new PsdRiskWarningMessage(), cusName, level).getMessageContent());
            EsbInvokeWrapper esbInvokeWrapper = new EsbInvokeWrapper(sedLetterInformService, letter, nlsQueueSoltComnService);
            esbInvokeWrapper.invoke3Threes();
            sendFlag = true;
        } catch (ESBException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return sendFlag;
    }

    /**
     * 需求编号：【2019D1218】（普税贷需求）
     * 问题编号：【2019D1218】（获取风险预警级别的中文描述）
     * 开发人员：【ludayong】
     * 创建日期：【2020/4/24 10:55】
     * 功能描述：
     * 修改日期：【2020/4/24 10:55】
     * 修改描述：
     */
    public static String getRiskLevelCn(String levle) {
        try {
            Class<?> cls = PsdEnumSet.RiskLevelEnum.class;
            String enNameStr = "getEnname";
            String cnNameStr = "getCnname";
            Method enNameMethod = cls.getMethod(enNameStr);
            Method cnNameMethod = cls.getMethod(cnNameStr);
            Object[] objs = cls.getEnumConstants();
            for (Object obj : objs) {
                if (levle.equals(enNameMethod.invoke(obj).toString())) {
                    return cnNameMethod.invoke(obj).toString();
                }
            }
        } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException me) {
            me.printStackTrace();
            logger.error("获取中文等级异常", me);
        }
        return null;
    }

    // 短信通知接口
    @Autowired
    @Qualifier("sedLetterInformService")
    private SedLetterInformService sedLetterInformService;

    // 告警服务
    @Autowired
    @Qualifier("nlsQueueSoltComnService")
    private NlsQueueSoltComnService nlsQueueSoltComnService;

    // 风险预警台账
    @Autowired
    @Qualifier("rscWarnLoanService")
    private RscWarnLoanService rscWarnLoanService;

    // 客户经理名单
    @Autowired
    @Qualifier("ptProductUserService")
    private PtProductUserService ptProductUserService;
}
